package com.github.cyf.excel.util;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * Excel工具类,不建议直接使用index操作sheet，在wps/excel中sheet显示顺序与index无关，还有隐藏sheet
 * @author chenyifan
 * @create 2024-04-02 9:27
 */
public class ExcelUtil {

    /**
     * POI 提供了 HSSF、XSSF 以及 SXSSF 三种方式操作 Excel
     * HSSF：是操作Excel97-2003版本，扩展名为.xls。
     * XSSF：是操作Excel2007版本开始，扩展名为.xlsx。
     * SXSSF：是在XSSF基础上，POI3.8版本开始提供的一种支持低内存占用的操作方式，扩展名为.xlsx。
     */
    public static final String XLS= "xls";
    public static final String XLSX = "xlsx";

    /**
     * 创建工作簿
     * @param excelType
     * @return
     */
    public static Workbook createWorkbook(String excelType) {
        if (excelType.equals(XLS)) {
            return new HSSFWorkbook();
        } else if (excelType.equals(XLSX)) {
            return new SXSSFWorkbook();
        } else {
            throw new RuntimeException("文件类型错误！");
        }
    }

    /**
     * 读取 excel 文件
     * @param filePath
     * @return
     */
    public static Workbook read(String filePath) {
        try(FileInputStream fis = new FileInputStream(filePath)) {
            if (filePath.endsWith(XLS)) {
                return new HSSFWorkbook(fis);
            } else if (filePath.endsWith(XLSX)) {
                return new SXSSFWorkbook(new XSSFWorkbook(fis));
            } else {
                throw new RuntimeException("文件类型错误！");
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
